<?php

namespace org;
/**
 * 常用的数组操作静态类
 *
 */
class Arrayprocess {

        /**
         * 将规则二维数组(如数据库结果集)转换为指定key的值一维数组(降维处理)
         *
         * @param array  $array 给定的原数组
         * @param string $key   键名
         * @return array/false  转化好的一维数组/给定数据不合法
         * @example
         *  $old_array = array(
         *                      array('id'=>1, 'name'=>'jack'),
         *                      array('id'=>2, 'name'=>'jim'),
         *                      ...
         *                      array('id'=>100, 'name'=>'james')
         *                    );
         *  array_to_simple($old_array, 'id')
         *  $new_array = array(1,2,3,...,100)
         */
        static public function array_to_simple($array, $key) {
//数组规则性判断
                if (!is_array($array) || empty($array) || !isset($key)) {
                        return false;
                }
                $first_element = array_slice($array, 0, 1);
                if (!is_array($first_element[0]) || !isset($first_element[0][$key])) {
                        return false;
                }
//数组处理
                $return = array();
                foreach ($array as $k => $v) {
                        $return[$k] = $v[$key];
                }
                return $return;
        }

        /**
         * 将二维数组转换为以指定key1值为键的数组
         * （该数组的key1对应值都各自唯一）
         *
         * @param array  $array 给定的二维数组
         * @param string $key_k  键名
         * @param string $key_v  键名（为空时，值为数组，不为空时，值为key2的值）
         * @return array        转化好的数组
         * @example
         *     $array = array(
         *                      array('id'=>10,'name'=>'aaa'),
         *                      array('id'=>21,'name'=>'bbb'),
         *                      array('id'=>32,'name'=>'ccc')
         *                   );
         *      array_to_hash($array, 'id');
         *      $hash_array = array(
         *                              '10'=>array('id'=>10,'name'=>'aaa'),
         *                              '21'=>array('id'=>21,'name'=>'bbb'),
         *                              '32'=>array('id'=>32,'name'=>'ccc')
         *                         );
         *      array_to_hash($array, 'id', 'name');
         *      $hash_array = array('10'=>'aaa', '21'=>'bbb', '32'=>'ccc');
         */
        static public function array_to_hash($array, $key_k, $key_v = '') {
//数组规则性判断
                if (!is_array($array) || empty($key_k)) {
                        return false;
                }
                $first_element = array_slice($array, 0, 1);
                if (!is_array($first_element[0]) || !isset($first_element[0][$key_k])) {
                        return false;
                }
//hash数组转化处理
                $return = array();
                if ($key_v === '') {
                        foreach ($array as $k => $v) {
                                $return[$v[$key_k]] = $v;
                        }
                } else {
                        foreach ($array as $k => $v) {
                                $return[$v[$key_k]] = $v[$key_v];
                        }
                }
                return $return;
        }

        /**
         * 将数组指定key的元素值转化为逗号分割的串（一般用于id的转化）
         *
         * @param array  $array 给定的二维数组
         * @param string $key   键名
         * @return array        转化好的数组
         * @example
         *      $array = array(
         *                      array('id'=>10,'name'=>'aaa'),
         *                      array('id'=>21,'name'=>'bbb'),
         *                      array('id'=>32,'name'=>'ccc')
         *                   );
         *      array_to_string($array, 'id');
         *      $string = "'10','21','32'";
         */
        static public function array_to_string($array, $key) {
                if (!isset($key) || !is_array($array)) {
                        return false;
                }
                $new_array = self::array_to_simple($array, $key);
                if ($new_array === false) {
                        return false;
                }
                $new_array = array_unique($new_array);
                if (count($new_array) > 0) {
                        return "'" . implode("','", $new_array) . "'";
                } else {
                        return "";
                }
        }

        /**
         * 数组截取
         *
         * @param array   $array        原数组
         * @param integer $offset       起始位置
         * @param integer $length       截取长度
         * @param bool    $preserve_key 是否保留原key(默认为true,不保留则为false)
         * @return array            截取后的数组
         * @example
         *      $array = array(
         *                      0=>array('id'=>10,'name'=>'aaa'),
         *                      1=>array('id'=>21,'name'=>'bbb'),
         *                      2=>array('id'=>32,'name'=>'ccc')
         *                   );
         *      array_slice($array, 1, 2);
         *      $result = array(
         *                      1=>array('id'=>21,'name'=>'bbb'),
         *                      2=>array('id'=>32,'name'=>'ccc')
         *                   );
         */
        static public function array_slice($array, $offset, $length, $preserve_key = true) {
                if (!is_array($array) || $offset < 0 || $length <= 0)
                        return false;
                $array_length = count($array);
                if ($offset >= $array_length)
                        return false;
                if (($offset + $length) > $array_length) {
                        $length = $array_length - $offset;
                }
                reset($array);
                $result = array();
                if ($offset > 0) {
                        for ($i = 0; $i < $offset; $i++) {
                                next($array);
                        }
                }
                if ($preserve_key) {
                        for ($i = 0; $i < $length; $i++) {
                                $tmp = each($array);
                                $result[$tmp['key']] = $tmp['value'];
                        }
                } else {
                        for ($i = 0; $i < $length; $i++) {
                                $tmp = each($array);
                                $result[$i] = $tmp['value'];
                        }
                }
                return $result;
        }

        /**
         * 规则二维数组（数据库结果数组）根据指定字段排序
         *
         * @param array   $array        规则的二维数组
         * @param string  $field_name   指定的排序字段
         * @param integer $sort_flag    排序顺序标志（SORT_ASC 升序 | SORT_DESC 降序）
         * @param integer $sort_type    排序类型标志（SORT_NUMERIC 按数值比较 | SORT_STRING 按字符串比较 | SORT_REGULAR 按通常方法比较）
         * @return array|bool
         * @example
         *      $array = array(
         *                  array('volume' => 85, 'edition' => 6),
         *                  array('volume' => 67, 'edition' => 2),
         *                  array('volume' => 98, 'edition' => 2)
         *              );
         *      array_multisort($array, 'volume', SORT_ASC, SORT_NUMERIC);
         *      $result = array(
         *                  array('volume' => 67, 'edition' => 2),
         *                  array('volume' => 85, 'edition' => 6),
         *                  array('volume' => 98, 'edition' => 2)
         *              );
         */
        static public function array_multisort($array, $field_name, $sort_flag = SORT_ASC, $sort_type = SORT_NUMERIC) {
                if (!is_array($array) || empty($field_name)) {
                        return false;
                }
                $sort_flag_array = array(SORT_ASC, SORT_DESC);
                $sort_type_array = array(SORT_NUMERIC, SORT_STRING, SORT_REGULAR);
                if (!in_array($sort_flag, $sort_flag_array) || !in_array($sort_type, $sort_type_array)) {
                        return false;
                }
                $record = each($array);
                if (!is_array($record) || !isset($record['value'][$field_name])) {
                        return false;
                }
                reset($array);
                $field_value = array();
                foreach ($array as $key => $value) {
                        $field_value[$key] = $value[$field_name];
                }
                array_multisort($field_value, $sort_flag, $sort_type, $array);
                return $array;
        }

}

?>